home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 January - Disc 2 / Macworld (1999-01) (Disk 2).dmg / Serious Demos / Symbolic Composer 4.2 / Environment / System / MRAC / Lengths / Modify / l-modify < prev    next >
Lisp/Scheme  |  1998-08-11  |  3KB  |  81 lines

  1. l-modify seed count type operator value pattern 
  2.  
  3. This is a companion function to change-length sharing the same operators. The difference lies in the way it changes or modifies note-length vales as ratios; change-length converts note-length ratios to ticks. 
  4.  
  5. The <operators> are: 
  6.  
  7. :add - adds value to length-values
  8. :sub - subtracts value from length-values
  9. :times - multiplies length-values by value
  10. :divide - divides length-values by value 
  11.  
  12. Unlike type-value it is possible to isolate modifications to via the <type> paramter using :rest, :note or :all. 
  13.  
  14. The <type> options are: 
  15.  
  16. :rest - rest value
  17. :note - length value
  18. :all   - rest and length values 
  19.  
  20. In these examples the <type> parameter modifies first rests-lengths then note-lengths (abbreviated to :rest and :note.) 
  21.  
  22. (setq len1 (qlength '8-1010))
  23.  
  24. (l-modify .45 nil :all :sub '1/16 len1)
  25. => (1/16 -1/16 1/16 -1/16)
  26.  
  27. (l-modify .45 1 :note :add '1/16 len1)
  28. => (3/16 -1/8 1/8 -1/8)
  29.  
  30. (l-modify .45 1 :note :divide 4 len1)
  31. => (1/32 -1/8 1/8 -1/8)
  32.  
  33. (l-modify nil 2 :all :times 4 len1)
  34. => (1/2 -1/8 1/8 -1/2)
  35. or (1/8 -1/2 1/2 -1/8) ...
  36.  
  37. Also, with the parameter <count> it is possible isolate particular note-lengths and using a list with the operator value provide different values for these isolated note-lengths. 
  38.  
  39. (l-modify .45 2 :rest :times '(5 3) len1)
  40. => (1/8 -5/8 1/8 -3/8)
  41.  
  42. The following examples show that by making the seed value nil modifications to a selected number of note-lengths / rest-lengths may be randomized. 
  43.  
  44. (l-modify nil 2 :all :times 4 len1)
  45. => (1/8 -1/8 1/2 -1/2)
  46. or (1/2 -1/8 1/8 -1/2)
  47. or (1/2 -1/8 1/2 -1/8) ...
  48.  
  49. (l-modify nil 2 :all :times '(5 3) len1)
  50. => (1/8 -1/8 5/8 -3/8)
  51.    (1/8 -5/8 3/8 -1/8) ...
  52.  
  53. The function works equally well on single and multiple lists of note-lengths. 
  54.  
  55. (setq len2 (qlength '((20-00101) (12-101))))
  56. (l-modify .45 2 :note :times 4 len2)
  57. => ((-1/20 -1/20 1/5 -1/20 1/5) (1/3 -1/12 1/3))
  58.  
  59. (l-modify .45 2 :note :times '(5 5 3 3) len2)
  60. => ((-1/20 -1/20 1/4 -1/20 1/4) (1/4 -1/12 1/4))
  61.  
  62. (l-modify .45 2 :note :times '(5 3) len2)
  63. => ((-1/20 -1/20 1/4 -1/20 3/20) (5/12 -1/12 1/4))
  64.  
  65. (l-modify .45 '(1 2) :note :times '(5 3) len2)
  66. => ((-1/20 -1/20 1/20 -1/20 1/4) (1/4 -1/12 5/12))
  67.  
  68.  
  69. (setq len3 (permute-unique (qlength '(20-10000))))
  70. (setq prime (vector-to-list (gen-primes 18)))
  71.  
  72. (l-modify .45 nil :note :times (symbol-shuffle prime .32) len3)
  73. => ((13/20 -1/20 -1/20 -1/20 -1/20)
  74.     (-1/20 11/20 -1/20 -1/20 -1/20)
  75.     (-1/20 -1/20 1/10 -1/20 -1/20)
  76.     (-1/20 -1/20 -1/20 17/20 -1/20)
  77.     (-1/20 -1/20 -1/20 -1/20 1/20))
  78.  
  79.  
  80.  
  81.